package com.priox.sigar.dto;

import com.mm.support.domain.TipoUsuario;
import com.priox.sigar.client.dto.*;
import com.priox.sigar.enums.*;
import org.apache.commons.lang3.StringUtils;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class ReporteContext {

    private int start;
    private int end;
    private List<AgrupacionDTO> agrupacionList = new ArrayList<AgrupacionDTO>();
    private List<MonedaDTO> monedaList = new ArrayList<MonedaDTO>();
    private List<SociedadDTO> sociedadList = new ArrayList<SociedadDTO>();
    private List<TipoReporteCxC> reporteCobrarList = new ArrayList<TipoReporteCxC>();
    private List<TipoReporteCxP> reportePagarList = new ArrayList<TipoReporteCxP>();
    private List<TipoReporteCxA> reporteAlmacenList = new ArrayList<TipoReporteCxA>();
    private List<TipoReporteBalance> reporteBCList = new ArrayList<TipoReporteBalance>();
    private CheckPointDTO checkPoint;
    private CheckPointDTO checkPointCxP;
    private CheckPointDTO checkPointCxC;
    private CheckPointDTO checkPointCxA;
    private CheckPointDTO checkPointBC;
    private TipoSegmentacionCxA tipoSegmentacionCxA;
    private Long rangoSelect;
    private Long rangoActual;
    private String sortColumn;
    private String sortOrden;
    private String tipoCambio;
    private String pedidoOrList;
    private String tipoMonto;
    private String columnMonto;
    private String positivoNegativo;
    private TipoModulo tipoModulo;
    private TipoModulo tipoModuloSelect;
    private TipoCuenta tipoCuenta;
    private TipoUsuario tipoUsuario;
    private TipoCuentaOperacion tipoCuentaOperacion;
    private GrupoEmpresarialDTO grupoEmpresarial;
    private List<GrupoEmpresarialDTO> grupoEmpresarialList;

    private GrupoEmpresarialDTO grupoEmpresarialSelect;
    private String usuarioSelect;
    private String proveedorSelect;
    private AcreedorDTO proveedorDTOSelect;
    private List<AcreedorDTO> acreedorDTOListSelect;
    private String pedidoSelect;
    private List<String> usuarioListSelect;
    private String cuentaContableSelect;
    private List<String> cuentaContableListSelect;
    private SociedadDTO sociedadSelect;
    private AgrupacionDTO agrupacionSelect;
    private MonedaDTO monedaSelect;
    private Boolean comparativo;
    private Date fechaTipoCambio;
    private Date fechaInicio;
    private Date fechaFin;
    private Date fechaInicioOrigen;
    private Date fechaFinOrigen;
    private Date fechaInicioReciente;
    private Date fechaFinReciente;
    private Boolean sincronizar;
    private String numeroDocumentoSelect;
    private Integer tipoComparacionSelect;

    /**
     * para el reporte comparativo
     */
    private CheckPointDTO checkPointBase;
    private CheckPointDTO checkPointActual;

    /**
     * para el reporte comparativo
     */
    // para definir si usar Fecha vencimiento o fecha contable
    private String tipoFecha;

    public String getTipoFecha() {
        return tipoFecha;
    }

    public void setTipoFecha(String tipoFecha) {
        this.tipoFecha = tipoFecha;
    }

    public List<AgrupacionDTO> getAgrupacionList() {
        return agrupacionList;
    }

    public void setAgrupacionList(List<AgrupacionDTO> agrupacionList) {
        this.agrupacionList = agrupacionList;
    }

    public List<SociedadDTO> getSociedadList() {
        return sociedadList;
    }

    public void setSociedadList(List<SociedadDTO> sociedadList) {
        this.sociedadList = sociedadList;
    }

    public List<TipoReporteCxP> getReportePagarList() {
        return reportePagarList;
    }

    public void setReportePagarList(List<TipoReporteCxP> reportePagarList) {
        this.reportePagarList = reportePagarList;
    }

    public List<TipoReporteCxC> getReporteCobrarList() {
        return reporteCobrarList;
    }

    public void setReporteCobrarList(List<TipoReporteCxC> reporteCobrarList) {
        this.reporteCobrarList = reporteCobrarList;
    }

    public CheckPointDTO getCheckPoint() {
        return checkPoint;
    }

    public Long getCheckPointId() {
        if (checkPoint == null) return null;
        return checkPoint.getCheckPointId();
    }

    public Long getCheckPointBCId() {
        if (checkPointBC == null) return null;
        return checkPointBC.getCheckPointId();
    }

    public void setCheckPoint(CheckPointDTO checkPoint) {
        this.checkPoint = checkPoint;
    }

    public GrupoEmpresarialDTO getGrupoEmpresarial() {
        return grupoEmpresarial;
    }

    public void setGrupoEmpresarial(GrupoEmpresarialDTO grupoEmpresarial) {
        this.grupoEmpresarial = grupoEmpresarial;
    }

    public SociedadDTO getSociedadSelect() {
        return sociedadSelect;
    }

    public void setSociedadSelect(SociedadDTO sociedadSelect) {
        this.sociedadSelect = sociedadSelect;
    }

    public AgrupacionDTO getAgrupacionSelect() {
        return agrupacionSelect;
    }

    public void setAgrupacionSelect(AgrupacionDTO agrupacionSelect) {
        this.agrupacionSelect = agrupacionSelect;
    }

    public CheckPointDTO getCheckPointBase() {
        return checkPointBase;
    }

    public void setCheckPointBase(CheckPointDTO checkPointBase) {
        this.checkPointBase = checkPointBase;
    }

    public CheckPointDTO getCheckPointActual() {
        return checkPointActual;
    }

    public void setCheckPointActual(CheckPointDTO checkPointActual) {
        this.checkPointActual = checkPointActual;
    }

    public List<TipoReporteCxA> getReporteAlmacenList() {
        return reporteAlmacenList;
    }

    public void setReporteAlmacenList(List<TipoReporteCxA> reporteAlmacenList) {
        this.reporteAlmacenList = reporteAlmacenList;
    }

    public MonedaDTO getMonedaSelect() {
        return monedaSelect;
    }

    public void setMonedaSelect(MonedaDTO monedaSelect) {
        this.monedaSelect = monedaSelect;
    }

    public boolean execute(TipoReporteCxP tipoReporte) {
        return reportePagarList.contains(tipoReporte);
    }

    public boolean execute(TipoReporteCxC tipoReporte) {
        return reporteCobrarList.contains(tipoReporte);
    }

    public boolean execute(TipoReporteCxA tipoReporte) {
        return reporteAlmacenList.contains(tipoReporte);
    }

    public TipoCuenta getTipoCuenta() {
        return tipoCuenta;
    }

    public void setTipoCuenta(TipoCuenta tipoCuenta) {
        this.tipoCuenta = tipoCuenta;
    }

    public Boolean getComparativo() {
        return comparativo;
    }

    public void setComparativo(Boolean comparativo) {
        this.comparativo = comparativo;
    }

    public List<MonedaDTO> getMonedaList() {
        return monedaList;
    }

    public void setMonedaList(List<MonedaDTO> monedaList) {
        this.monedaList = monedaList;
    }

    public TipoUsuario getTipoUsuario() {
        return tipoUsuario;
    }

    public void setTipoUsuario(TipoUsuario tipoUsuario) {
        this.tipoUsuario = tipoUsuario;
    }

    public List<GrupoEmpresarialDTO> getGrupoEmpresarialList() {
        if (grupoEmpresarialList == null) {
            grupoEmpresarialList = new ArrayList<GrupoEmpresarialDTO>();
        }
        return grupoEmpresarialList;
    }

    public void setGrupoEmpresarialList(List<GrupoEmpresarialDTO> grupoEmpresarialList) {
        this.grupoEmpresarialList = grupoEmpresarialList;
    }

    public GrupoEmpresarialDTO getGrupoEmpresarialSelect() {
        return grupoEmpresarialSelect;
    }

    public void setGrupoEmpresarialSelect(GrupoEmpresarialDTO grupoEmpresarialSelect) {
        this.grupoEmpresarialSelect = grupoEmpresarialSelect;
    }

    public String getUsuarioSelect() {
        return usuarioSelect;
    }

    public void setUsuarioSelect(String usuarioSelect) {
        this.usuarioSelect = usuarioSelect;
    }

    public String getProveedorSelect() {
        return proveedorSelect;
    }

    public void setProveedorSelect(String proveedorSelect) {
        this.proveedorSelect = proveedorSelect;
    }

    public String getCuentaContableSelect() {
        return cuentaContableSelect;
    }

    public void setCuentaContableSelect(String cuentaContableSelect) {
        this.cuentaContableSelect = cuentaContableSelect;
    }

    public String getNumeroDocumentoSelect() {
        return numeroDocumentoSelect;
    }

    public void setNumeroDocumentoSelect(String numeroDocumentoSelect) {
        this.numeroDocumentoSelect = numeroDocumentoSelect;
    }

    public Integer getTipoComparacionSelect() {
        return tipoComparacionSelect;
    }

    public void setTipoComparacionSelect(Integer tipoComparacionSelect) {
        this.tipoComparacionSelect = tipoComparacionSelect;
    }

    public CheckPointDTO getCheckPointBC() {
        return checkPointBC;
    }

    public void setCheckPointBC(CheckPointDTO checkPointBC) {
        this.checkPointBC = checkPointBC;
    }

    public TipoModulo getTipoModulo() {
        return tipoModulo;
    }

    public void setTipoModulo(TipoModulo tipoModulo) {
        this.tipoModulo = tipoModulo;
    }

    public Date getFechaTipoCambio() {
        return fechaTipoCambio;
    }

    public void setFechaTipoCambio(Date fechaTipoCambio) {
        this.fechaTipoCambio = fechaTipoCambio;
    }

    public List<TipoReporteBalance> getReporteBCList() {
        return reporteBCList;
    }

    public void setReporteBCList(List<TipoReporteBalance> reporteBCList) {
        this.reporteBCList = reporteBCList;
    }

    public String getTipoCambio() {
        return tipoCambio;
    }

    public void setTipoCambio(String tipoCambio) {
        this.tipoCambio = tipoCambio;
    }

    public TipoCuentaOperacion getTipoCuentaOperacion() {
        return tipoCuentaOperacion;
    }

    public void setTipoCuentaOperacion(TipoCuentaOperacion tipoCuentaOperacion) {
        this.tipoCuentaOperacion = tipoCuentaOperacion;
    }

    public String getTipoMonto() {
        return tipoMonto;
    }


    public void setTipoMonto(String tipoMonto) {
        this.tipoMonto = tipoMonto;
    }

    public CheckPointDTO getCheckPointCxP() {
        return checkPointCxP;
    }

    public void setCheckPointCxP(CheckPointDTO checkPointCxP) {
        this.checkPointCxP = checkPointCxP;
    }

    public CheckPointDTO getCheckPointCxC() {
        return checkPointCxC;
    }

    public void setCheckPointCxC(CheckPointDTO checkPointCxC) {
        this.checkPointCxC = checkPointCxC;
    }

    public CheckPointDTO getCheckPointCxA() {
        return checkPointCxA;
    }

    public void setCheckPointCxA(CheckPointDTO checkPointCxA) {
        this.checkPointCxA = checkPointCxA;
    }

    public TipoModulo getTipoModuloSelect() {
        return tipoModuloSelect;
    }

    public void setTipoModuloSelect(TipoModulo tipoModuloSelect) {
        this.tipoModuloSelect = tipoModuloSelect;
    }

    public Date getFechaInicio() {
        return fechaInicio;
    }

    public void setFechaInicio(Date fechaInicio) {
        this.fechaInicio = fechaInicio;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public AcreedorDTO getProveedorDTOSelect() {
        return proveedorDTOSelect;
    }

    public void setProveedorDTOSelect(AcreedorDTO proveedorDTOSelect) {
        this.proveedorDTOSelect = proveedorDTOSelect;
    }


    @Override
    public String toString() {
        return "ReporteContext{" +
                "agrupacionList=" + agrupacionList +
                ", monedaList=" + monedaList +
                ", sociedadList=" + sociedadList +
                ", reporteCobrarList=" + reporteCobrarList +
                ", reportePagarList=" + reportePagarList +
                ", reporteAlmacenList=" + reporteAlmacenList +
                ", reporteBCList=" + reporteBCList +
                ", checkPoint=" + checkPoint +
                ", checkPointCxP=" + checkPointCxP +
                ", checkPointCxC=" + checkPointCxC +
                ", checkPointCxA=" + checkPointCxA +
                ", checkPointBC=" + checkPointBC +
                ", tipoCambio='" + tipoCambio + '\'' +
                ", tipoMonto='" + tipoMonto + '\'' +
                ", tipoModulo=" + tipoModulo +
                ", tipoModuloSelect=" + tipoModuloSelect +
                ", tipoCuenta=" + tipoCuenta +
                ", tipoUsuario=" + tipoUsuario +
                ", tipoCuentaOperacion=" + tipoCuentaOperacion +
                ", grupoEmpresarial=" + grupoEmpresarial +
                ", grupoEmpresarialList=" + grupoEmpresarialList +
                ", grupoEmpresarialSelect=" + grupoEmpresarialSelect +
                ", usuarioSelect='" + usuarioSelect + '\'' +
                ", proveedorSelect='" + proveedorSelect + '\'' +
                ", proveedorDTOSelect=" + proveedorDTOSelect +
                ", cuentaContableSelect='" + cuentaContableSelect + '\'' +
                ", sociedadSelect=" + sociedadSelect +
                ", agrupacionSelect=" + agrupacionSelect +
                ", monedaSelect=" + monedaSelect +
                ", comparativo=" + comparativo +
                ", fechaTipoCambio=" + fechaTipoCambio +
                ", fechaInicio=" + fechaInicio +
                ", fechaFin=" + fechaFin +
                ", numeroDocumentoSelect='" + numeroDocumentoSelect + '\'' +
                ", tipoComparacionSelect=" + tipoComparacionSelect +
                ", checkPointBase=" + checkPointBase +
                ", checkPointActual=" + checkPointActual +
                ", tipoFecha='" + tipoFecha + '\'' +
                '}';
    }

    public Boolean getSincronizar() {
        return sincronizar;
    }

    public void setSincronizar(Boolean sincronizar) {
        this.sincronizar = sincronizar;
    }

    public Date getFechaInicioOrigen() {
        return fechaInicioOrigen;
    }

    public void setFechaInicioOrigen(Date fechaInicioOrigen) {
        this.fechaInicioOrigen = fechaInicioOrigen;
    }

    public Date getFechaFinOrigen() {
        return fechaFinOrigen;
    }

    public void setFechaFinOrigen(Date fechaFinOrigen) {
        this.fechaFinOrigen = fechaFinOrigen;
    }

    public Date getFechaInicioReciente() {
        return fechaInicioReciente;
    }

    public void setFechaInicioReciente(Date fechaInicioReciente) {
        this.fechaInicioReciente = fechaInicioReciente;
    }

    public Date getFechaFinReciente() {
        return fechaFinReciente;
    }

    public void setFechaFinReciente(Date fechaFinReciente) {
        this.fechaFinReciente = fechaFinReciente;
    }

    public List<AcreedorDTO> getAcreedorDTOListSelect() {
        return acreedorDTOListSelect;
    }

    public void setAcreedorDTOListSelect(List<AcreedorDTO> acreedorDTOListSelect) {
        this.acreedorDTOListSelect = acreedorDTOListSelect;
    }

    public List<String> getUsuarioListSelect() {
        return usuarioListSelect;
    }

    public void setUsuarioListSelect(List<String> usuarioListSelect) {
        this.usuarioListSelect = usuarioListSelect;
    }

    public List<String> getCuentaContableListSelect() {
        return cuentaContableListSelect;
    }

    public void setCuentaContableListSelect(List<String> cuentaContableListSelect) {
        this.cuentaContableListSelect = cuentaContableListSelect;
    }

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }

    public int getEnd() {
        return end;
    }

    public void setEnd(int end) {
        this.end = end;
    }


    public String getPositivoNegativo() {
        return positivoNegativo;
    }

    public void setPositivoNegativo(String positivoNegativo) {
        this.positivoNegativo = positivoNegativo;
    }

    public String getPedidoSelect() {
        return pedidoSelect;
    }

    public void setPedidoSelect(String pedidoSelect) {
        this.pedidoSelect = pedidoSelect;
    }

    public String getPedidoOrList() {
        if (StringUtils.isBlank(pedidoSelect)) {
            return null;
        }
        String[] pedidoListSelect = pedidoSelect.split("\\r?\\n|\\;");
        int i = 0;
        StringBuilder sb = new StringBuilder();
        for (String next : pedidoListSelect) { // ('%'+ #{razonSocial} +'%')
            if(StringUtils.isBlank(next)) continue;
            if (i > 0) sb.append(" OR ");
            sb.append(" NUMERO_DOCUMENTO_COMPRA ");

            if (next.contains("%")) {
                sb.append("LIKE '").append(next.trim()).append("' ");
            } else {
                sb.append("= '").append(next.trim()).append("'");
            }
            i++;
        }
        return sb.toString();
    }

    public void setPedidoOrList(String pedidoOrList) {
        this.pedidoOrList = pedidoOrList;
    }

    public String getColumnMonto() {
        return "".equals(columnMonto)?"DETALLE.MONTO_IMPORTE_VALORADO":"DETALLE.MONTO_MONEDA_LOCAL";
    }

    public void setColumnMonto(String columnMonto) {
        this.columnMonto = columnMonto;
    }

    public TipoSegmentacionCxA getTipoSegmentacionCxA() {
        return tipoSegmentacionCxA;
    }

    public void setTipoSegmentacionCxA(TipoSegmentacionCxA tipoSegmentacionCxA) {
        this.tipoSegmentacionCxA = tipoSegmentacionCxA;
    }

    public Long getRangoSelect() {
        return rangoSelect;
    }

    public void setRangoSelect(Long rangoSelect) {
        this.rangoSelect = rangoSelect;
    }

    public Long getRangoActual() {
        return rangoActual;
    }

    public void setRangoActual(Long rangoActual) {
        this.rangoActual = rangoActual;
    }

    public String getSortColumn() {
        return sortColumn;
    }

    public void setSortColumn(String sortColumn) {
        this.sortColumn = sortColumn;
    }

    public String getSortOrden() {
        return sortOrden;
    }

    public void setSortOrden(String sortOrden) {
        this.sortOrden = sortOrden;
    }
}
